// funkcja do obsługi gracza
var Player = function (startX, startY, atrybuty, _zloto) {

    // pozycja gracza
    var x = startX;
    var y = startY;

    var sila = atrybuty.sila;
    var szybkosc = atrybuty.szybkosc;
    var witalnosc = atrybuty.witalnosc;
    var zasieg = atrybuty.zasieg;

    var zycie = witalnosc * 10;

    var wyposazenie = [];

    var strzal = [];
    var ktoryStrzal = 0;


    var nazwa = atrybuty.nazwa;

    var strona = STRONA.DOBRO;

    if (["wampir", "wilkolak", "nekromanta"].contains(nazwa)) {

        strona = STRONA.ZLO;
    }

    var zloto = _zloto;

    var exp = 0;

    // zmiana położenia w danej klatce
    var dx = 0;
    var dy = 0;

    // obrazek reprezentujący gracza
    var image = IMG[nazwa];

    // o ile pikseli ma się przesuwać w każdym kroku
    var step = szybkosc * 5;

    // pozycja na wejściowym obrazku (do wybierania odpowiedniej klatki animacji)
    var xPos = 0;
    var yPos = 0;

    // indeksy klatek dla ruchu w poszczególnych kierunkach
    // np leftIndex może przyjmować wartości 4, 5, 6, 7 i potem znowu wraca do 4
    // analogicznie każdy inny kierunek
    var downIndex = 0;
    var leftIndex = 4;
    var rightIndex = 8;
    var upIndex = 12;


    var frameW = image.width / 4; // szerokość pojedynczej klatki z obrazka wejściowego
    var frameH = image.height / 4; // wysokość pojedynczej klatki z obrazka wejściowego
    // (przy założeniu, że to obrazek 4x4)

    function restart() {

        zycie = witalnosc * 10;
        x = startX;
        y = startY;
        playerPosition = [x, y];
    }

    function strzelaj(px, py, mx, my) {

        if (ktoryStrzal > 0) {
            return;
        }

        var dx = mx - (px + 20);
        var dy = my - (py + 20);

        console.log("dx: ", dx, dy);

        var dist = Math.sqrt(dx * dx + dy * dy);
        dx = dx / dist;
        dy = dy / dist;

        // dlugosc strzalu zalezy od zasiegu
        dx *= zasieg / 3;
        dy *= zasieg / 3;

        console.log("dx: ", dx, dy);

        kolejnyStrzal(px + 20, py + 20, dx, dy);
    }


    function kolejnyStrzal(sx, sy, dx, dy) {

        ktoryStrzal++;

        strzal = [sx, sy];


        if (ktoryStrzal < 50) {

            setTimeout(function () {
                kolejnyStrzal(sx + dx, sy + dy, dx, dy);
            }, 20);
        } else {
            ktoryStrzal = 0;
            strzal = [];

        }
    }


    function utracDoswiadzczenie() {
        exp = (exp * 0.9 ) | 0;
    }


    function sprawdzPrzeszkody(x, y) {

        var cx = x + frameW/2 | 0;
        var cy = y + frameH/2 | 0

        for (var i = 0; i < trees.length; i++) {

            var tx = trees[i][0] + 32;
            var ty = trees[i][1] + 32;

            var dt = Math.sqrt((cx - tx) * (cx - tx) + (cy - ty) * (cy - ty));

            if (dt < 32 + (frameW/2 | 0) - 3) {
                return true;
            }
        }

        for (var i = 0; i < stawy.length; i++) {

            var sx = stawy[i][0] + 20;
            var sy = stawy[i][1] + 20;

            var dt = Math.sqrt((cx - sx) * (cx - sx) + (cy - sy) * (cy - sy));


            if (dt < 24 + (frameW / 2 | 0) - 3) {
                return true;
            }
        }

        return false;
    }


    // obsługa sterowania
    var update = function (keys) {

        dx = 0;
        dy = 0;

        if (zycie < 10 * witalnosc && (Math.random() < (0.01 * witalnosc ))) {

            zycie++;
        }

        var prevX = x;
        var prevY = y;


        if (keys.up) {
            y -= step; // zmiana położenia gracza
            dy = -step; // oraz zapamiętanie zmiany położenia
        } else if (keys.down) {
            y += step;
            dy = step;
        }

        if (keys.left) {
            x -= step;
            dx = -step;
        } else if (keys.right) {
            x += step;
            dx = step;
        }




        if (sprawdzPrzeszkody(x, y)) {
            x = prevX;
            y = prevY;
        }

        // wypisuje statystyki
        document.getElementById("posx").innerHTML = "x: " + x;
        document.getElementById("posy").innerHTML = "y: " + y;

        document.getElementById("zycie").innerHTML = "życie: " + zycie + "/" + (witalnosc * 10) + "";
        document.getElementById("exp").innerHTML = "doświadczenie: " + exp;

        document.getElementById("sila").innerHTML = "siła: " + sila;
        document.getElementById("szybkosc").innerHTML = "szybkość: " + szybkosc;
        document.getElementById("witalnosc").innerHTML = "witalność: " + witalnosc;
        document.getElementById("zasieg").innerHTML = "zasięg: " + zasieg;

        document.getElementById("zloto").innerHTML = "Zloto: " + zloto;


        return [x, y, strzal];
    };

    // ustawia pozycje
    function setPos(px, py) {

        x = px;
        y = py;
    }

    // dodaje zakupione wyposazenie i zmienia kolor tla na ekranie na zielony
    function dodajWyposazenie(element, cena) {

        if (wyposazenie.contains(element)) {

            $("#komunikat").html("Juz posiadasz dany przedmiot");
            return;
        }


        if (zloto >= cena) {

            zloto -= cena;
            wyposazenie.push(element);
            $("#" + element).css('background-color', '#66bb77');
        } else {

            $("#komunikat").html("Za malo zlota!");
        }
    }

    function ileZlota() {

        return zloto;
    }


    function getX() {

        return x;
    }

    function getY() {

        return y;
    }

    function ileDoswiadczenia() {

        return exp;
    }

    function zyskajZloto(ile) {

        zloto += ile;
    }

    function dojenie() {


        if (wyposazenie.contains("wiadro")) {

            $("#komunikat").html("Udalo sie wydoic krowe");
            zloto += 2;
        }

        else {
            $("#komunikat").html("Nie masz wiadra!");
        }
    }

    function rabanie() {

        if (wyposazenie.contains("siekiera")) {

            $("#komunikat").html("Udalo sie wyrabac drzewo");
            zloto += 3;
        }

        else {
            $("#komunikat").html("Nie masz siekiery!");
        }
    }

    function lowienie() {


        if (wyposazenie.contains("wedka") && wyposazenie.contains("przyneta")) {

            $("#komunikat").html("Udalo sie zlowic rybe");
            zloto += 1;
        }

        else {
            $("#komunikat").html("Nie masz wedki lub przynety!");
        }
    }

    function wydobywanie() {


        if (wyposazenie.contains("kilof")) {

            $("#komunikat").html("Udalo sie wydobyc zloto z kopalni");
            zloto += 4;
        }

        else {
            $("#komunikat").html("Nie masz kilofa!");
        }
    }

    function podniesUmiejetnosc(cecha, ile) {

        console.log(cecha, ile, zloto);

        if (ile == 1 && zloto >= 10) {


            if (cecha === "sila") {

                if (sila < 12) sila++;
                else return;
            }

            if (cecha === "szybkosc") {

                if (szybkosc < 12) szybkosc++;
                else return;
            }

            if (cecha === "witalnosc") {

                if (witalnosc < 12) witalnosc++;
                else return;
            }

            if (cecha === "zasieg") {

                if (zasieg < 12) zasieg++;
                else return;
            }

            zloto -= 10;
        }


        if (ile == 2 && zloto >= 15) {

            if (cecha === "sila") {

                if (sila < 11) sila += 2;
                else return;
            }

            if (cecha === "szybkosc") {

                if (szybkosc < 11) szybkosc += 2;
                else return;
            }

            if (cecha === "witalnosc") {

                if (witalnosc < 11) witalnosc += 2;
                else return;
            }

            if (cecha === "zasieg") {

                if (zasieg < 11) zasieg += 2;
                else return;
            }

            zloto -= 15;
        }

        step = szybkosc * 5;
        zycie = 10 * witalnosc;

        console.log(cecha, ile, zloto);
    }

    function zyskajDoswiadczenie(ile) {


        // zyskuje losowa wartość doświadczenie
        exp += ile;
    }




    // utrata życia
    var loseHP = function () {


        zycie--;
        document.getElementById("zycie").innerHTML = "życie: " + zycie + "/" + (witalnosc * 10) + "";

        return (zycie < 0.1);
    }

    var draw = function (context, offX, offY) {

        if (zycie < 0.1) {
            return;
        }

        frameW = image.width / 4; // szerokość pojedynczej klatki z obrazka wejściowego
        frameH = image.height / 4; // wysokość pojedynczej klatki z obrazka wejściowego

        context.drawImage(image, xPos, yPos, frameW, frameH, x - offX, y - offY, frameW, frameH);

        // każdy z poniższych 4 ifów odpowiada za animację w określonym kierunku
        // animacja jest realizowana przez obliczanie współrzędnych na wejściowym obrazku (sprite)
        // dzięki czemu możemy się dostać do klatki pożądanej w danym momencie


        // animacja chodzenia w dół
        if (dy > 0) {

            xPos += frameW;
            yPos = 0;
            downIndex += 1;

            if (xPos + frameW > image.width) {
                xPos = 0;
                downIndex = 0;
            }
        }

        // animacja chodzenia w górę
        else if (dy < 0) {

            xPos += frameW;
            yPos = 3 * frameH;
            upIndex += 1;

            if (xPos + frameW > image.width) {
                xPos = 0;
                upIndex = 12;
            }
        }

        // animacja chodzenie w prawo
        else if (dx > 0) {

            xPos += frameW;
            yPos = 2 * frameH;
            rightIndex += 1;

            if (xPos + frameW > image.width) {
                xPos = 0;
                rightIndex = 8;
            }
        }

        // animacja chodzenia w lewo
        else if (dx < 0) {

            xPos += frameW;
            yPos = frameH;
            leftIndex += 1;

            if (xPos + frameW > image.width) {
                xPos = 0;
                leftIndex = 4;
            }
        }
    };

    function koniecStrzalu() {

        ktoryStrzal = 11;
    }

    function framePos() {

        return [xPos, yPos];
    }

    function ileZycia() {
        return zycie;
    }

    function ileSily() {
        return sila;
    }

    function wspStrzalu() {
        return strzal;
    }

    return {
        update:update,
        draw:draw,
        loseHP:loseHP,
        restart: restart,
        atrybuty:atrybuty,
        nazwa:nazwa,

        dodajWyposazenie:dodajWyposazenie,
        dojenie:dojenie,

        wydobywanie:wydobywanie,
        lowienie:lowienie,
        rabanie:rabanie,

        podniesUmiejetnosc:podniesUmiejetnosc,

        zyskajDoswiadczenie:zyskajDoswiadczenie,
        zyskajZloto:zyskajZloto,

        ileZlota:ileZlota,
        ileDoswiadczenia : ileDoswiadczenia,

        setPos:setPos,
        zyskajZloto:zyskajZloto,

        strzelaj:strzelaj,

        strzal:strzal,
        koniecStrzalu:koniecStrzalu,

        framePos : framePos,

        getX : getX,
        getY : getY,

        strona : strona,
        utracDoswiadczenie : utracDoswiadzczenie,

        ileZycia : ileZycia,
        ileSily : ileSily,

        wspStrzalu : wspStrzalu
    }
}